# -*- coding: utf-8 -*-
"""
Auteurs: Félix Cloutier et David Charbonneau

C'est ce fichier qu'il faut exécuter (en duo avec Server.py) pour faire fonctionner
le programme.

"""
import TextualAnalysisInterface
import CalendarInterface
import InterfaceKeyWord
import SheetInterface
import InterfaceUseCase
import cPickle
import xmlrpclib
import Sheet
import tkSimpleDialog
from Tkinter import *

""" 
Le Client est l'objet qui se charge de donner à l'utilisateur toutes les fonctions
dont il a besoin. C'est le contrôleur qui raboute toutes les classes d'interface graphique
pour les unifier.
Responsabilités:
    selectProject() # englobe la sélection et la création de projets
Collaborateurs:
    L'interface Tkinter
    Un objet ServerProxy pour communiquer avec le serveur
    Une fenêtre où afficher toutes les possibilités
"""
class Client(object):
    def __init__(self):
        """ La classe locale ServerProxy sert à simplifier l'accès au serveur pour
            les autres classes du projet. Elle s'occupe de sérialiser et désérialiser les objets
            pour les faire transiter entre le client et le serveur.
            Ses méthodes sont un miroir de celles de la classe locale ServerProxy de ProjectServer.
            Responsabilités:
                - getObjectsOfClass(projet, classe):
                    retourne tous les objets d'une classe que le projet contient.
                - setObject(projet, object):
                    sauvegarde un objet dans la base de données.
                - deleteObject(project, object):
                    supprime un objet de la base de données.
                - deleteObjects(project, list):
                    supprime les objets contenus dans la liste de la base de données.
                - getProjects()
                    retourne la liste des projets créés.
            Collaborateur: l'objet parent
        """
        class ServerProxy(xmlrpclib.ServerProxy):
            def __init__(proxy, server = "localhost", port = 8000):
                xmlrpclib.ServerProxy.__init__(proxy, "http://%s:%i" % (server, port), allow_none = True)
            
            def getObjectsOfClass(proxy, desiredClass, idList = None):
                result = proxy.__getattr__("getObjectsOfClass")(self.project, cPickle.dumps(desiredClass))
                return cPickle.loads(result)
            
            def setObject(proxy, anObject):
                result = proxy.__getattr__("setObject")(self.project, cPickle.dumps(anObject))
                loadedObject = cPickle.loads(result)
                anObject.id = loadedObject.id
                return loadedObject
            
            def deleteObject(proxy, anObject):
                return proxy.__getattr__("deleteObject")(self.project, cPickle.dumps(anObject))
            
            def deleteObjects(proxy, objectList):
                return proxy.__getattr__("deleteObjects")(self.project, cPickle.dumps(objectList))
            
            def getProjects(proxy):
                return cPickle.loads(proxy.__getattr__("getProjects")())
        
        self.root = Tk()
        self.root.title("Gestion de projets")
        self.project = None
        
        self.server = ServerProxy()
        while self.project == None:
            self.selectProject()
        
        self.frame = Frame()
        Button(self.frame, text="Changer de projet", command=self.selectProject).pack()
        modules = [TextualAnalysisInterface, CalendarInterface, InterfaceKeyWord, SheetInterface, InterfaceUseCase]
        for module in modules:
            module.PlugIn(self)
        self.frame.pack()
    
    def selectProject(self):
        projects = self.server.getProjects()
        window = Toplevel(self.root)
        window.title("Sélectionnez un projet")
        list = Listbox(window, width = 60, height = 10)
        
        def newProject():
            project = tkSimpleDialog.askstring("Nouveau projet", "Entrez le nom du nouveau projet:")
            projects.append(project)
            list.insert(END, project)
        
        def selectProject(event):
            if len(list.curselection()) != 0:
                self.project = projects[int(list.curselection()[0])]
                window.destroy()
                self.root.title("Gestion de projets: " + self.project)
        
        Button(window, text = "Nouveau projet", command=newProject).grid(row = 1, column = 0)
        list.bind("<Double-Button-1>", selectProject)
        list.grid(row = 0, column = 0)
        for project in projects:
            list.insert(END, project)
        
        window.protocol("WD_WINDOW_DELETE", selectProject)
        
        window.wait_window(window)

if __name__ == '__main__': 
    client = Client()
    client.root.mainloop()